Welcome to the Pycom forum Forum
    • \[\[global:header.categories\]\]
    • \[\[global:header.recent\]\]
    • \[\[global:header.tags\]\]
    • \[\[global:header.popular\]\]
    • Login

    Explore Pybytes | Official Documentation | Report a Firmware Bug/Issue | GitHub

    "resource not available" when assigning P9 / G16 as ADC

    Scheduled Pinned Locked Moved LoPy
    adc
    13 Posts 4 Posters 2.5k Views 4 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • sorenS Offline
      soren
      last edited by soren

      Hello,

      After much headache I discovered this post (https://forum.pycom.io/topic/313/lopy-pin-out/3)
      where one user says that it's possible to find the correlation between chip pins and expansion board pins with a REPL command.
      And so I found out that P9 on the chip is G16 on the expansion board and this pin should have ADC capability.

      So I wrote in my code:

      adc = machine.ADC()
      sensorPin = adc.channel(pin="P9")

      But it keeps throwing a "OSError: resource not available" on that second line. I did import machine.

      What is this supposed to mean? That P9 is not G16 after all, or despite this diagram (https://docs.pycom.io/chapter/datasheets/downloads/lopy-pinout.pdf) saying that P9 has ADC, it does not? Or that some other feature on this port prevents me from using it?

      EDIT: after making sure I wasn't using ADC2 ( the ones on the left side), I got rid of this error for some time. Now it's come back, and it doesn't matter which pin I use: ADC is just not available as a resource, and I'm getting no clue what so ever as to why this is..

      J 1 Reply Last reply Reply Quote 0
      • J Offline
        jmarcelino @soren
        last edited by

        @soren
        The ADC2 pins are not available from Python, at least for the time being. You can only use ones starting with ADC1_...

        sorenS H 3 Replies Last reply Reply Quote 0
        • sorenS Offline
          soren @jmarcelino
          last edited by

          @jmarcelino thank you very much for chiming in. i'm baffled why this isn't stated in capital letters on the official pinout diagrams

          1 Reply Last reply Reply Quote 0
          • sorenS Offline
            soren @jmarcelino
            last edited by soren

            @jmarcelino so now I'm also getting this error from ADC1 pins... P14, to be precise

            robert-hhR 1 Reply Last reply Reply Quote 0
            • robert-hhR Offline
              robert-hh @soren
              last edited by

              @soren Are sou sure? I can do it here.

              import machine
              adc = machine.ADC()
              sensorPin = adc.channel(pin="P14")
              
              sorenS 1 Reply Last reply Reply Quote 1
              • sorenS Offline
                soren @robert-hh
                last edited by

                @robert-hh

                Hi robert, as far as I can tell - I'm doing the same thing as you.. here is my code, it's on line 9 ("sensorPin = adc...) it reports this error:

                import machine 
                from machine import Pin
                import time
                import pycom
                from machine import ADC
                from machine import PWM
                
                adc = machine.ADC()
                sensorPin = adc.channel(pin='P23', attn=ADC.ATTN_11DB) # G4 on expansion board
                ledArray = [0x7f0000, 0x007f00, 0x0000ff] # red, green, blue
                step_p = Pin('P8', mode=Pin.OUT)
                stepDir_p = Pin('P21', mode=Pin.OUT)
                
                
                class ColorSensor:
                
                    dosingPump_p = Pin('P21', mode=Pin.OUT)
                    dosingPump_p.value(0)
                    # SERVO:
                    pwm = PWM(0, frequency=50)
                    servo_p = pwm.channel(0, pin='P22', duty_cycle=0.127)
                    servo_p.duty_cycle(0.107)
                    # 0.107 # upright position
                    # 0.03 # pouring position
                
                    balanceSet = False
                    colourArray = [0, 0, 0]
                    whiteArray = [0, 0, 0]
                    blackArray = [0, 0, 0]
                    avgRead = 0
                
                    def checkBalance(self):
                        print("checking balance")
                        if not self.balanceSet:
                            self.setBalance()
                
                    def setBalance(self):
                        print("setting balance")
                        time.sleep(5)
                        for num in range(0, 3): # set white bal
                            print(num)
                            pycom.rgbled(ledArray[num]) # set to color
                            time.sleep(0.1)
                            self.getReadings(5)
                            self.whiteArray[num] = self.avgRead
                            print('avgRead from bal ', self.avgRead)
                            pycom.rgbled(0x000000) # turn off led
                            time.sleep(0.1)
                        time.sleep(5)
                        for num in range(0, 3): # set black bal
                            pycom.rgbled(ledArray[num])
                            time.sleep(0.1)
                            self.getReadings(5)
                            self.blackArray[num] = self.avgRead
                            pycom.rgbled(0x000000) # turn off led
                            time.sleep(0.1)
                        self.balanceSet = True
                        time.sleep(5)
                
                
                    def checkColour(self):
                        print("rinsing...")
                        for num in range(0, 3): # rinse glass 3 times
                            dosingPump_p.value(1) # take in water from aquarium
                            time.sleep_ms(500) # how much water to take in?
                            dosingPump_p.value(0) # turn off dosing pump
                            time.sleep(1)
                            servo_p.duty_cycle(0.03) # pour out water
                            time.sleep(4)
                            servo_p.duty_cycle(0.107) # turn back glass
                            time.sleep(4)
                        print('rinsing finished! Taking in water...')
                        dosingPump_p.value(1) # take in water from aquarium
                        time.sleep_ms(500) # how much water to take in?
                        dosingPump_p.value(0) # turn off dosing pump
                        time.sleep(1)
                
                        print('taking plunger down...')
                        for num in range(0, 201): # take plunger down
                            step_p.value(1)
                            time.sleep_ms(500)
                            step_p.value(0)
                            time.sleep_ms(500)
                            # check if plunger is all the way down and break ?
                        print('plunger is down! Waiting for analysis...')
                
                        time.sleep(1) # set to 3 minutes
                        print('analysis ready! Reading colours...')
                
                        for num in range(0, 3):
                            pycom.rgbled(ledArray[num]) # set to color
                            time.sleep(0.1)
                            self.getReadings(5)
                            self.colourArray[num] = self.avgRead
                            print('whitearray ', self.whiteArray[num], ' blackArray ', self.blackArray[num])
                            greyDiff = self.whiteArray[num] - self.blackArray[num]
                            print('greydiff: ', greyDiff)
                            self.colourArray[num] = (self.colourArray[num] - self.blackArray[num])/(greyDiff)*255
                            pycom.rgbled(0x000000) # turn off led
                            time.sleep(0.1)
                
                    def printColour(self):
                        print('printing colour')
                        return self.colourArray[0], self.colourArray[1], self.colourArray[2]
                
                    def getReadings(self, times):
                        reading = 0
                        tally = 0
                        for num in range(0, times+1):
                            reading = sensorPin()
                            print('reading ', reading)
                            tally = reading + tally
                            time.sleep(0.01)
                        self.avgRead = (tally)/times
                        print('avgRead ', self.avgRead)
                        #print('avgRead ', avgRead)
                
                robert-hhR 1 Reply Last reply Reply Quote 0
                • robert-hhR Offline
                  robert-hh @soren
                  last edited by robert-hh

                  @soren P23 belongs to ADC2 ..... You should write P14, or G4, like you state in the comment

                  sorenS 1 Reply Last reply Reply Quote 0
                  • sorenS Offline
                    soren @robert-hh
                    last edited by soren

                    @robert-hh yes, sorry i know - I have been trying with the following pins with that code i send you now: "13, 14, 15 and 23". 13, 14 and 15 is adc1.

                    I think maybe I understand the problem a tiny bit better now:
                    it happens only when I'm doing a soft reset. When I do a hard reset, it works again. Is this because a soft reset doesn't free up the pins maybe?

                    1 Reply Last reply Reply Quote 0
                    • H Offline
                      HenroRitchie @jmarcelino
                      last edited by

                      @jmarcelino Is this still the case. I am trying to access ADC2 on a Lopy4 and get the same error OSError: resource not available. ADC1 seems to be working fine.

                      J 1 Reply Last reply Reply Quote 0
                      • J Offline
                        jmarcelino @HenroRitchie
                        last edited by

                        @HenroRitchie
                        I've not followed the Pycom developments too closely but at low level ADC2 is only available when WiFi is off "ADC2 is used by the Wi-Fi driver. Therefore the application can only use ADC2 when the Wi-Fi driver has not started."

                        My guess is this complicates things in a dynamic Python environment where you can turn WiFi on and off at will so probably not a priority.

                        To be honest ADC1 is quite noisy so I avoid the ESP32 ADCs altogether and now use a more "industrial grade" external solution.

                        H robert-hhR 2 Replies Last reply Reply Quote 1
                        • H Offline
                          HenroRitchie @jmarcelino
                          last edited by

                          @jmarcelino Thank you, noted. Will design accordingly.

                          1 Reply Last reply Reply Quote 0
                          • robert-hhR Offline
                            robert-hh @jmarcelino
                            last edited by

                            @jmarcelino Hello Jose. Are you back again?

                            J 1 Reply Last reply Reply Quote 0
                            • J Offline
                              jmarcelino @robert-hh
                              last edited by

                              @robert-hh
                              Hey Robert! Good to see you're still around. Not back at Pycom but some collaboration brewing up, watch this space ;-)

                              1 Reply Last reply Reply Quote 0

                              Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                              Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                              With your input, this post could be even better 💗

                              Register Login
                              • 1 / 1
                              • First post
                                Last post

                              Pycom on Twitter

                              Pycom