pyb_ina219 icon indicating copy to clipboard operation
pyb_ina219 copied to clipboard

(Solution) "OSError: [Errno 5] EIO" when running with Micropython on Raspberry Pi Pico

Open mburde7 opened this issue 3 years ago • 11 comments

Hi Chris,

I tried to get this running on my Raspberry Pi Pico and was getting an error. Here is the message:

"Traceback (most recent call last): File "", line 8, in File "ina219.py", line 189, in configure File "ina219.py", line 316, in _calibrate File "ina219.py", line 361, in _calibration_register File "ina219.py", line 391, in __write_register OSError: [Errno 5] EIO"

From this thread: https://forum.micropython.org/viewtopic.php?t=4746 I saw that the Pico seems to need delays for I2C to work well, so I added the utime.sleep delays to your example code:

from ina219 import INA219
from machine import I2C
import utime

I2C_INTERFACE_NO = 1
SHUNT_OHMS = 0.1  # Check value of shunt used with your INA219

ina = INA219(SHUNT_OHMS, I2C(I2C_INTERFACE_NO, scl=machine.Pin(19), sda=machine.Pin(18))) 
utime.sleep_ms(10) 
ina.configure()
utime.sleep_ms(10)
print("Bus Voltage: %.3f V" % ina.voltage())
print("Current: %.3f mA" % ina.current())
print("Power: %.3f mW" % ina.power())
~~~~~~

Hope this helps anyone else with similar issues!

mburde7 avatar Aug 17 '22 22:08 mburde7

I'm having this same issue and am wondering if you ever figured it out?

IHasToes1234 avatar Sep 06 '22 03:09 IHasToes1234

Maybe my comment wasn't super clear - the "utime.sleep_ms(10)" code additions do fix the issue and I haven't had any trouble with the INA219 since.

mburde7 avatar Sep 06 '22 15:09 mburde7

I got this error when trying the code from your comment:

Traceback (most recent call last): File "", line 10, in File "ina219.py", line 189, in configure File "ina219.py", line 316, in _calibrate File "ina219.py", line 361, in _calibration_register File "ina219.py", line 391, in __write_register OSError: [Errno 5] EIO

Do you know what could be causing this?

IHasToes1234 avatar Sep 07 '22 00:09 IHasToes1234

Can you give more details on your setup? Maybe your circuit design. Also make sure you're using the right pins - I'm using pins GP 18 and GP 19 which are actually the 24th and 25th pico pins respectively.

mburde7 avatar Sep 10 '22 14:09 mburde7

Worked perfectly when I used GP18 & 19.

IHasToes1234 avatar Sep 10 '22 18:09 IHasToes1234

Glad its working! There are two I2C bus connections you can use (this is using I2C 1). In my setup I'm using two INA219s - one connected to GP18, GP19 and the other connected to GP12, GP13. Just make sure you indicate which I2C bus you're using by adding the 0 or 1 to this line (reference the pico pinout to see where the I2C0 and I2C1 are). Here is what I am using:

ina = INA219(SHUNT_OHMS, I2C(1, scl=machine.Pin(19), sda=machine.Pin(18))) ina_1 = INA219(SHUNT_OHMS, I2C(0, scl=machine.Pin(13), sda=machine.Pin(12)))

mburde7 avatar Sep 11 '22 13:09 mburde7

Hey, I know its been a while, but I need help again. I am using the same setup for the INA219s as you recommended. Do I need a second copy of every file for the second INA board? I would assume yes, and if so, what do I need to change in the second set of files? I changed the address in the ina219.py file and in my run file. I still cant seem to get it to work.

Here is my run code if needed (starting on button press, checking every hour):

`from machine import Pin import _thread import utime

button=Pin(0, Pin.IN, Pin.PULL_DOWN)

def tp(): execfile("run.py")
def sp(): execfile("run_1.py") time=5 buttonNow=0 while True: if buttonNow==1: time=time+1 print("Tracking Panel at %s:30:" % time) tp() print("Stationary Panel at %s:30:" % time) sp() utime.sleep(2.5) buttonNow=1 else: buttonNow=button.value()`

Run_1 file (if needed):

`from ina219_1 import INA219 from ina219_1 import DeviceRangeError from machine import I2C import utime

#data list (clear daily and add to sheet) data = []

I2C_INTERFACE_NO = 0 SHUNT_OHMS = 0.1 # Check value of shunt used with your INA219

ina = INA219(SHUNT_OHMS, I2C(I2C_INTERFACE_NO, scl=machine.Pin(13), sda=machine.Pin(12)), address=0x41) utime.sleep_ms(10) ina.configure() utime.sleep_ms(10) try: data = ['Bus Voltage: %.3f V' % ina.voltage(), 'Bus Current: %.3f mA' % ina.current(),'Shunt voltage: %.3f mV' % ina.shunt_voltage(),'Power: %.3f mW' % ina.power()] print(data) except DeviceRangeError as e: # Current out of device range with specified shunt resister print ("e")`

Error:

"Traceback (most recent call last): File "", line 19, in File "", line 10, in sp File "run_1.py", line 14, in File "ina219_1.py", line 186, in configure File "ina219_1.py", line 313, in _calibrate File "ina219_1.py", line 358, in _calibration_register File "ina219_1.py", line 388, in __write_register OSError: [Errno 5] EIO"

The ina219_1.py file is the same as the default one but with address changed to 0x41 and the range changed to 16V

PS: Thanks for all the help!

IHasToes1234 avatar Oct 06 '22 03:10 IHasToes1234

Also if you dont feel like reading this I could just look at your code and figure it out from there.

IHasToes1234 avatar Oct 08 '22 21:10 IHasToes1234

So you are talking to two ina219's from one pico?

In this case one of them need a different address on i2c bus, see section 8.5.5.1 of the datasheet. Then in code each ina219 instance can be initialize with its own address.

Regards Chris

On Sun, 9 Oct 2022, 10:42 IHasToes1234, @.***> wrote:

Also if you dont feel like reading this I could just look at your code and figure it out.

— Reply to this email directly, view it on GitHub https://github.com/chrisb2/pyb_ina219/issues/9#issuecomment-1272401858, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAXR2V5RMP5JUYCM26CQT4TWCHTEXANCNFSM563DDDJQ . You are receiving this because you are subscribed to this thread.Message ID: @.***>

chrisb2 avatar Oct 12 '22 08:10 chrisb2

Hey Chris!

I am very dumb and have no idea what you mean. I soldered the pins on the breakout board to make the address 0x41 but have no idea what to do code wise. Do I need a separate ina219.py, and if so, do I only have to change the address for the second. I believe they are on different i2c buses as well.

IHasToes1234 avatar Oct 12 '22 22:10 IHasToes1234

Assuming you have correctly configured the two devices with different addresses, you can attach them both to the same i2c bus (same two i2c sda/scl pins). You only need one ina219.py file and import.

The address can be passed in as an argument to the constructor, see address arg: https://github.com/chrisb2/pyb_ina219#functions

I suggest you separately connect each device and check its responding correctly on its address, then attach both and test.

Chris

chrisb2 avatar Oct 13 '22 07:10 chrisb2

I'm getting errors when a relay connects and disconnects the sensor to a battery and the code runs in a loop. Nothing is connected on the other side but it says current overflow. I've tried adding delays but still randomly after sometime I get these errors.

Its a Pico W

Traceback (most recent call last): File "", line 47, in File "ina219.py", line 219, in power File "ina219.py", line 381, in _power_register File "ina219.py", line 397, in __read_register OSError: [Errno 19] ENODEV

or..

Traceback (most recent call last): File "", line 48, in File "ina219.py", line 226, in shunt_voltage File "ina219.py", line 255, in _handle_current_overflow File "ina219.py", line 364, in _has_current_overflow File "ina219.py", line 372, in _read_voltage_register File "ina219.py", line 397, in __read_register OSError: [Errno 5] EIO

Also what does "The library currently only supports continuous reads of voltage and power, but not triggered reads" means, I can't use it like this?

supreeet avatar Nov 06 '22 13:11 supreeet

No comments for a while, so closing, please raise a new issue if required. Thx

chrisb2 avatar Mar 28 '23 07:03 chrisb2