0 Replies Latest reply on May 3, 2020 11:01 PM by ajkatz83

    Omnibot Michelle--Ultrasonic sensors

    ajkatz83

      So during this quarantine period I began working on a pet project to make a robot companion. I didn't wish for it to be WiFi or keyboard controlled--fully autonomous and able to navigate for itself. So far I have been really successful in some code I have cobbled together. I am suing Python, so that may be why. I am using the original gearbox and motors the Omnibot came with from 1982, and they work great with the L298D motor controller that I am using. Just tonight I reworked the ultrasonic sensors, the HC-SR04, the typical ones that are cheap an easy to come by, and that had success seeing that when their is less than 15cm to go, it will stop, back up, turn a direction and carry on. I would leave well enough alone and carry on myself to a new piece of the robot to install and make, however, in the code I was trying to work out a rear senors, or a second HC-SR04, but I am not have the best of luck understanding where I am going wrong with this:

       

      import RPi.GPIO as GPIO                    #Import GPIO library
      import time
      
      
      #Import time library
      GPIO.setwarnings(False)
      GPIO.setmode(GPIO.BCM)                    # programming the GPIO by BCM pin numbers
      
      
      TRIG = 17
      ECHO = 27
      TRIG1 = 23
      ECHO1 = 24
      led = 22
      
      
      m11=16
      m12=12
      m21=21
      m22=20
      
      
      GPIO.setup(TRIG,GPIO.OUT)                  # initialize GPIO Pin as outputs
      GPIO.setup(ECHO,GPIO.IN)                   # initialize GPIO Pin as input
      GPIO.setup(TRIG1,GPIO.OUT)                  # initialize GPIO Pin as outputs
      GPIO.setup(ECHO1,GPIO.IN)                   # initialize GPIO Pin as input
      
      
      GPIO.setup(led,GPIO.OUT)                  
      
      
      GPIO.setup(m11,GPIO.OUT)
      GPIO.setup(m12,GPIO.OUT)
      GPIO.setup(m21,GPIO.OUT)
      GPIO.setup(m22,GPIO.OUT)
      
      
      GPIO.output(led, 1)
      
      
      time.sleep(5)
      
      
      def stop():
          print "stop"
          GPIO.output(m11, 0)
          GPIO.output(m12, 0)
          GPIO.output(m21, 0)
          GPIO.output(m22, 0)
      
      
      def forward():
          GPIO.output(m11, 1)
          GPIO.output(m12, 0)
          GPIO.output(m21, 1)
          GPIO.output(m22, 0)
          print "Forward"
      
      
      def back():
          GPIO.output(m11, 0)
          GPIO.output(m12, 1)
          GPIO.output(m21, 0)
          GPIO.output(m22, 1)
          print "back"
      
      
      def left():
          GPIO.output(m11, 0)
          GPIO.output(m12, 0)
          GPIO.output(m21, 1)
          GPIO.output(m22, 0)
          print "left"
      
      
      def right():
          GPIO.output(m11, 1)
          GPIO.output(m12, 0)
          GPIO.output(m21, 0)
          GPIO.output(m22, 0)
          print "right"
      
      
      stop()
      count=0
      while True:
       i=0
       avgDistance=0
       for i in range(5):
        GPIO.output(TRIG, False)                 #Set TRIG as LOW
        time.sleep(0.1)                                   #Delay
      
      
        GPIO.output(TRIG, True)                  #Set TRIG as HIGH
        time.sleep(0.00001)                           #Delay of 0.00001 seconds
        GPIO.output(TRIG, False)                 #Set TRIG as LOW
      
      
        while GPIO.input(ECHO)==0:              #Check whether the ECHO is LOW
             GPIO.output(led, False)             
        pulse_start = time.time()
      
      
        while GPIO.input(ECHO)==1:              #Check whether the ECHO is HIGH
             GPIO.output(led, False) 
        pulse_end = time.time()
        pulse_duration = pulse_end - pulse_start #time to get back the pulse to sensor
      
      
        distance = pulse_duration * 17150        #Multiply pulse duration by 17150 (34300/2) to get distance
        distance = round(distance,2)                 #Round to two decimal points
        avgDistance=avgDistance+distance
      
      
      while True:
       i=0
       avgDistance=0
       for i in range(5):
        GPIO.output(TRIG1, False)
        time.sleep(0.1)
      
      
        GPIO.output(TRIG1, True)
        time.sleep(0.00001)
        GPIO.output(TRIG1, False)
      
      
       while GPIO.input(ECHO1)==0:
            GPIO.output(led, False)
       pulse_start = time.time()
      
      
       while GPIO.input(ECHO1)==1:
            GPIO.output(led, False)
       pulse_end = time.time()
       pulse_duration = pulse_end - pulse_start
       distance = pulse_duration * 17150
       distance = round(distance,2)
       avgDistance=avgDistance+distance 
      
      
      
      
       avgDistance=avgDistance/5
       print avgDistance
       flag=0
       if avgDistance < 15:      #Check whether the distance is within 15 cm range
          count=count+1
          stop()
          time.sleep(1)
          back()
          time.sleep(1.5)
          if (count%3 ==1) & (flag==0):
           right()
           flag=1
          else:
           left()
           flag=0
          time.sleep(1.5)
          stop()
          time.sleep(1)
       else:
          forward()
          flag=0
      

       

      Since I ran this, it just comes to the stop command and just waits.....maybe I got some kind of logic conflict or dual TRIG and ECHO; I had figured what I wrote out from both sensors was correct but I guess not. Any answers or recommendations how to get two sensors working for front and rear ends of this robot?